using UnityEngine;

/// <summary>
/// 预制体生成器：挂载在空物体上，用于自动生成指定预制体，并在预制体销毁后延迟指定时间重新生成
/// </summary>
public class PrefabSpawner : MonoBehaviour
{
    [Header("生成设置")]
    [Tooltip("需要生成的预制体，必须在Inspector中指定")]
    public GameObject prefabToSpawn;

    [Tooltip("预制体生成位置，如果未指定则使用当前物体位置")]
    public Transform spawnPoint;

    [Tooltip("预制体销毁后重新生成的延迟时间（秒）")]
    public float respawnDelay = 5f;

    [Header("旋转设置")]
    [Tooltip("预制体生成时绕X轴的旋转角度（度）")]
    public float xRotation = 90f;

    [Tooltip("预制体生成时绕Y轴的旋转角度（度）")]
    public float yRotation = 0f;

    [Tooltip("预制体生成时绕Z轴的旋转角度（度）")]
    public float zRotation = 0f;

    // 当前生成的预制体实例
    private GameObject currentInstance;
    // 重生计时器
    private float respawnTimer = 0f;

    /// <summary>
    /// 初始化时尝试生成预制体
    /// </summary>
    private void Start()
    {
        // 如果未指定生成点，使用当前物体位置
        if (spawnPoint == null)
        {
            spawnPoint = transform;
        }

        // 初始生成预制体
        SpawnPrefab();
    }

    /// <summary>
    /// 每帧检查预制体状态并更新计时器
    /// </summary>
    private void Update()
    {
        // 如果当前没有预制体实例，开始计时
        if (currentInstance == null)
        {
            respawnTimer += Time.deltaTime;

            // 当计时器达到延迟时间时，重新生成预制体
            if (respawnTimer >= respawnDelay)
            {
                SpawnPrefab();
                respawnTimer = 0f;
            }
        }
    }

    /// <summary>
    /// 生成预制体的方法
    /// </summary>
    private void SpawnPrefab()
    {
        // 检查是否已指定预制体
        if (prefabToSpawn == null)
        {
            Debug.LogError("未指定需要生成的预制体！请在Inspector中为PrefabSpawner组件赋值prefabToSpawn字段");
            return;
        }

        // 生成预制体并保存实例引用
        // 计算最终旋转角度：生成点旋转 + 额外旋转
        Quaternion spawnRotation = spawnPoint.rotation * Quaternion.Euler(xRotation, yRotation, zRotation);
        currentInstance = Instantiate(prefabToSpawn, spawnPoint.position, spawnRotation);
        Debug.LogFormat("在位置 {0} 生成预制体: {1}", spawnPoint.position, prefabToSpawn.name);
    }

    /// <summary>
    /// 手动销毁当前预制体实例（供外部调用）
    /// </summary>
    public void DestroyCurrentInstance()
    {
        if (currentInstance != null)
        {
            Destroy(currentInstance);
            currentInstance = null;
            Debug.Log("当前预制体实例已销毁，将在指定延迟后重新生成");
        }
    }
}

/* 使用说明：
1. 将此脚本挂载到场景中的空物体上
2. 在Inspector面板中：
   - 拖拽需要生成的预制体到"Prefab To Spawn"字段
   - （可选）指定生成位置（Spawn Point），不指定则使用挂载物体的位置
   - （可选）调整重生延迟时间（Respawn Delay），默认为5秒
3. 运行场景后，系统会自动生成预制体，当预制体被销毁后，将在指定延迟时间后自动重新生成

参数说明：
- prefabToSpawn: 需要自动生成的预制体，必须指定
- spawnPoint: 预制体生成的位置和旋转，如果未指定则使用挂载脚本物体的位置和旋转
- respawnDelay: 预制体销毁后重新生成的延迟时间（秒），默认5秒

公共方法：
- DestroyCurrentInstance(): 手动销毁当前预制体实例，触发重生计时器
*/